home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 February / OpenLinux 2.3 CD.iso / live / usr / lib / rpm-2.5.5 / cklibc5.pl next >
Encoding:
Perl Script  |  1998-10-07  |  2.6 KB  |  135 lines

  1. #! /usr/bin/perl -w
  2. # $Id: cklibc5.pl,v 1.2 1998/10/07 15:27:16 ray Exp $
  3. # created by Torsten Duwe
  4. # modified to fit in 'rpm -b' framework by Raymund Will
  5.  
  6. ($C = $0) =~ s%.*/%%;
  7.  
  8. @Sections = (
  9.   ".bss",
  10.   ".comment",
  11.   ".ctors",
  12.   ".data",
  13.   ".dtors",
  14.   ".dynamic",
  15.   ".dynstr",
  16.   ".dynsym",
  17.   ".eh_frame",
  18.   ".fini",
  19.   ".gcc_except_table",
  20.   ".got",
  21.   ".hash",
  22.   ".init",
  23.   ".interp",
  24.   ".note",
  25.   ".plt",
  26.   ".rel.bss",
  27.   ".rel.ctors",
  28.   ".rel.data",
  29.   ".rel.dtors",
  30.   ".rel.eh_frame",
  31.   ".rel.gcc_except_table",
  32.   ".rel.got",
  33.   ".rel.plt",
  34.   ".rel.rodata",
  35.   ".rel.stab",
  36.   ".rel.text ",
  37.   ".rodata",
  38.   ".stab",
  39.   ".stabstr",
  40.   ".text",
  41. );
  42.  
  43. %DontOmit = (
  44.   ".dynstr", 1,
  45.   ".interp", 1,
  46. );
  47.  
  48. $OptErr = "";
  49. %Fail = ();
  50. $Err = 0;
  51.  
  52. if ( $#ARGV < $[ ) {
  53.   $OptErr .= sprintf( "$C: missing parameter(s)\n");
  54. } elsif ( $#ARGV > $[ ) {
  55.   $OptErr .= sprintf( "$C: superfluous parameter(s)\n");
  56. } else {
  57.   $Dir = shift;
  58. }
  59.   
  60. if ( $OptErr || ! defined($Dir) || ! -d "$Dir" ) {
  61.   print( STDERR $OptErr) if ( $OptErr );
  62.   die( "Usage: $C dir\n");
  63. }
  64.  
  65. $Omit = "";
  66. $OmitAllKnown = "";
  67. foreach $i ( sort( @Sections) ) {
  68.   $Known{$i} = 1;
  69.   $OmitAllKnown .= "-R $i ";
  70.   next if ( defined( $DontOmit{$i}) );
  71.   $Omit .= "-R $i ";
  72. }
  73.  
  74. open( FIND, "find $Dir -type f -print | sort|") || die;
  75.  
  76. while ( <FIND> ) {
  77.   chop;
  78.  
  79.   # has to be readable 
  80.   -r $_ || next;
  81.  
  82.   # has to be an ELF binary
  83.   open(IN, "< $_");
  84.   sysread(IN, $magic, 4);
  85.   close(IN);
  86.   $magic =~ m,\177ELF, || next;
  87.  
  88.   # unknown sections in the ELF file fill produce a non-empty var here:
  89.   if ( `objcopy -O binary $_ /dev/fd/1 $OmitAllKnown 2>&1` ne "" ) {
  90.     my @New = ();
  91.     my $f = $_;
  92.     open( IN, "objdump -h $f |") || die;
  93.     while ( <IN> ) {
  94.       my $n = /^\s+\d+ (\.\S+)/ || next;
  95.       #next unless ( /^\s+\d+ (\.\S+)/ );
  96.       next if ( defined( $Known{$1}) );
  97.       push( @New, $1);
  98.       $Known{$1} = 1;
  99.       $Omit .= " -R $1";
  100.       $OmitAllKnown .= " -R $1";
  101.     }
  102.     close( IN);
  103.     if ( @New ) {
  104.       print( STDERR "$C: $f: new unknown section(s): @New\n");
  105.     }
  106.     $_ = $f;
  107.   }
  108.  
  109.   $INTERP = `objcopy -O binary $_ /dev/fd/1 $Omit -R .dynstr`;
  110.   $DYNSTR = `objcopy -O binary $_ /dev/fd/1 $Omit -R .interp`;
  111.  
  112.   if ( $INTERP =~ m,/lib/ld-linux.so.1, ) {
  113.     $Fail{$_} = "ld.so";
  114.     $Err++;
  115.   }
  116.  
  117.   if ( $DYNSTR =~ m,\000lib[cm].so.5\000, ) {
  118.     if ( defined( $Fail{$_}) ) {
  119.       $Fail{$_} .= " and libs";
  120.     } else {
  121.       $Fail{$_} = "old libs";
  122.       $Err++;
  123.     } 
  124.   }
  125. }
  126. close( FIND);
  127.  
  128. if ( $Err ) {
  129.   print( STDERR "WARNING: illegal references to old stuff in:\n");
  130.   foreach $i ( sort( keys( %Fail)) ) {
  131.     print( STDERR "  $i: $Fail{$i}\n");
  132.   }
  133. }
  134. exit( $Err);
  135.